package com.yanyeori.framework.storage.service;

import com.yanyeori.framework.storage.controller.vo.STSInfo;
import com.yanyeori.framework.storage.controller.vo.UrlSignInfo;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 文件中心接口
 *
 * @author chenkuan 2023/2/14
 */
public interface StorageService {
    /**
     * STS模式-获取STS授权信息
     */
    STSInfo getSTSInfo();

    /**
     * 自签名模式-获取上传链接签名
     *
     * @param content 待签名内容
     */
    UrlSignInfo getSign(String content);

    /**
     * 获取上传链接
     *
     * @param name 文件名
     */
    Map<String, String> getUploadUrl(String name);

    /**
     * 获取文件链接
     *
     * @param key 文件key
     * @return 文件链接
     */
    String getFileUrl(String key);

    /**
     * 获取文件自定义有效期的链接
     *
     * @param key  文件key
     * @param time 过期时间
     * @param unit 时间单位
     * @return 文件链接
     */
    String getFileUrl(String key, long time, TimeUnit unit);

    /**
     * 批量获取文件链接
     *
     * @param keys 文件key列表
     * @return 文件链接Map
     */
    Map<String, String> listFileUrl(List<String> keys);

    /**
     * 批量获取文件自定义有效期的链接
     *
     * @param keys 文件key列表
     * @param time 过期时间
     * @param unit 时间单位
     * @return 文件链接Map
     */
    Map<String, String> listFileUrl(List<String> keys, long time, TimeUnit unit);

    /**
     * 文件上传接口
     *
     * @param file     上传的文件流
     * @param filename 文件名
     * @return 文件key
     */
    String uploadFile(InputStream file, String filename);

    /**
     * 文件上传接口
     *
     * @param file     上传的文件
     * @param filename 文件名
     * @return 文件key
     */
    String uploadFile(File file, String filename);

    /**
     * 获取文件存放路径前缀
     */
    String getPathPrefix();

    /**
     * 判断文件是否存在
     *
     * @param key 文件key
     * @return boolean
     */
    boolean doesFileExist(String key);
}
